package priv.pattern.observer;

import java.util.HashSet;
import java.util.Set;

// 观察者模式
public class ObserverPattern {
    public static void main(String[] args) {
        // 创建主题
        Subject subject = new ConcreteSubject();
        // 创建观察者
        Observer observerA = new ConcreteObserverA();
        Observer observerB = new ConcreteObserverB();
        // 注册观察者
        subject.registerObserver(observerA);
        subject.registerObserver(observerB);
        // ... 进行一些操作
        // 然后通知观察者
        subject.notifyObservers("Hello, world!");
    }
}

// 观察者接口
interface Observer {
    public void update(String message);
}

// 具体观察者A
class ConcreteObserverA implements Observer {
    @Override
    public void update(String message) {
        System.out.println("ConcreteObserverA received message: " + message);
    }
}

// 具体观察者B
class ConcreteObserverB implements Observer {
    @Override
    public void update(String message) {
        System.out.println("ConcreteObserverB received message: " + message);
    }
}

// 主题接口
interface Subject {
    // 注册观察者
    void registerObserver(Observer observer);
    // 移除观察者
    void removeObserver(Observer observer);
    // 通知观察者
    void notifyObservers(String message);
}

// 具体主题
class ConcreteSubject implements Subject {
    Set<Observer> observers = new HashSet<>();
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}